package neuralNetwork;

import org.encog.engine.network.activation.ActivationSigmoid;
import org.encog.ml.data.MLData;
import org.encog.ml.data.MLDataPair;
import org.encog.ml.data.MLDataSet;
import org.encog.ml.data.basic.BasicMLDataSet;
import org.encog.neural.networks.layers.BasicLayer;
import org.encog.neural.networks.training.propagation.resilient.ResilientPropagation;

public class ColorNeuralNetwork extends NeuralNetwork {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	private static MLDataSet trainingSet;

	public void start() {
		addLayer(new BasicLayer(null, true, 3));

		addLayer(new BasicLayer(new ActivationSigmoid(), true, 5));
		addLayer(new BasicLayer(new ActivationSigmoid(), false, 3));
		getStructure().finalizeStructure();
		reset();

		// training data
		trainingSet = new BasicMLDataSet(COLOR_INPUT, COLOR_IDEAL);

		// train the neural network
		final ResilientPropagation train = new ResilientPropagation(this,
				trainingSet);

		int epoch = 1;

		do {
			train.iteration();
			System.out
					.println("Epoch #" + epoch + " Error:" + train.getError());
			epoch++;
		} while (train.getError() > 0.01);
		train.finishTraining();
	}

	public boolean isBlack(double[] rgb) {
		// { 1.0, 1.0, 1.0 }
		if (rgb[0] > 0.7 && rgb[1] > 0.7 && rgb[2] > 0.7) {
			return true;
		}
		return false;
	}

	public boolean isBlue(double[] rgb) {
		// {1.0, 1.0, 0.0}
		if (rgb[0] > 0.7 && rgb[1] > 0.7 && rgb[2] < 0.3) {
			return true;
		}
		return false;
	}

	public boolean isPink(double[] rgb) {
		// { 1.0, 0.0, 0.0 }
		if (rgb[0] > 0.7 && rgb[1] < 0.3 && rgb[2] < 0.3) {
			return true;
		}
		return false;
	}

	public boolean isYellow(double[] rgb) {
		// { 0.0, 1.0, 0.0 }
		if (rgb[0] < 0.3 && rgb[1] > 0.7 && rgb[2] < 0.3) {
			return true;
		}
		return false;
	}

	public boolean isGreen(double[] rgb) {
		// { 0.0, 0.0, 1.0 }
		if (rgb[0] < 0.3 && rgb[1] < 0.3 && rgb[2] > 0.7) {
			return true;
		}
		return false;
	}

	public double[] normalizeColor(int r, int g, int b) {
		return new double[] { r * 0.001, g * 0.001, b * 0.001 };
	}

	private static double[][] COLOR_INPUT =

	{
			// Black
			{ 0.090, 0.069, 0.087 },
			{ 0.089, 0.069, 0.087 },
			{ 0.089, 0.069, 0.087 },
			{ 0.090, 0.069, 0.087 },
			{ 0.073, 0.064, 0.069 },
			{ 0.074, 0.064, 0.068 },
			{ 0.056, 0.036, 0.046 },
			{ 0.054, 0.036, 0.046 },
			{ 0.053, 0.036, 0.046 },
			{ 0.056, 0.037, 0.046 },
			{ 0.055, 0.036, 0.046 },
			{ 0.054, 0.035, 0.047 },
			{ 0.074, 0.064, 0.069 },
			{ 0.088, 0.076, 0.084 },
			{ 0.088, 0.076, 0.084 },
			{ 0.088, 0.077, 0.084 },
			{ 0.066, 0.050, 0.061 },
			{ 0.066, 0.050, 0.061 },
			{ 0.065, 0.049, 0.060 },
			{ 0.064, 0.050, 0.062 },
			{ 0.066, 0.050, 0.062 },
			{ 0.066, 0.050, 0.061 },
			{ 0.056, 0.039, 0.048 },
			{ 0.056, 0.038, 0.048 },
			{ 0.057, 0.039, 0.049 },
			{ 0.076, 0.057, 0.071 },
			{ 0.094, 0.073, 0.091 },
			{ 0.094, 0.073, 0.091 },
			{ 0.094, 0.073, 0.091 },
			{ 0.094, 0.073, 0.091 },
			{ 0.090, 0.069, 0.087 },
			{ 0.089, 0.069, 0.085 },
			{ 0.090, 0.069, 0.086 },
			{ 0.088, 0.069, 0.087 },
			{ 0.089, 0.069, 0.087 },
			{ 0.089, 0.069, 0.087 },
			{ 0.089, 0.069, 0.086 },
			{ 0.089, 0.068, 0.086 },
			{ 0.089, 0.069, 0.086 },
			{ 0.089, 0.069, 0.086 },
			{ 0.090, 0.070, 0.087 },
			{ 0.089, 0.069, 0.086 },
			{ 0.088, 0.068, 0.085 },
			{ 0.080, 0.061, 0.076 },
			{ 0.078, 0.060, 0.076 },
			{ 0.079, 0.060, 0.075 },
			{ 0.080, 0.067, 0.075 },
			{ 0.081, 0.067, 0.078 },
			{ 0.082, 0.068, 0.078 },
			{ 0.083, 0.069, 0.078 },
			{ 0.067, 0.053, 0.062 },

			// BLUE
			{ 0.151, 0.174, 0.165 },
			{ 0.151, 0.174, 0.165 },
			{ 0.151, 0.174, 0.166 },
			{ 0.151, 0.173, 0.165 },
			{ 0.152, 0.174, 0.165 },
			{ 0.152, 0.174, 0.165 },
			{ 0.151, 0.174, 0.167 },
			{ 0.151, 0.173, 0.165 },
			{ 0.151, 0.174, 0.166 },
			{ 0.151, 0.173, 0.165 },
			{ 0.151, 0.173, 0.165 },
			{ 0.151, 0.174, 0.166 },
			{ 0.151, 0.174, 0.165 },
			{ 0.151, 0.174, 0.165 },
			{ 0.151, 0.174, 0.165 },
			{ 0.151, 0.174, 0.165 },
			{ 0.151, 0.173, 0.165 },
			{ 0.151, 0.174, 0.165 },
			{ 0.151, 0.174, 0.166 },
			{ 0.151, 0.173, 0.165 },
			{ 0.151, 0.173, 0.165 },
			{ 0.147, 0.169, 0.160 },
			{ 0.148, 0.170, 0.162 },
			{ 0.148, 0.170, 0.162 },
			{ 0.148, 0.170, 0.162 },
			{ 0.147, 0.170, 0.162 },
			{ 0.150, 0.172, 0.164 },
			{ 0.149, 0.172, 0.164 },
			{ 0.149, 0.172, 0.164 },
			{ 0.149, 0.172, 0.164 },
			{ 0.149, 0.172, 0.164 },
			{ 0.147, 0.170, 0.161 },
			{ 0.147, 0.171, 0.162 },
			{ 0.148, 0.170, 0.162 },
			{ 0.147, 0.171, 0.162 },
			{ 0.147, 0.170, 0.161 },
			{ 0.147, 0.170, 0.161 },
			{ 0.147, 0.170, 0.162 },
			{ 0.148, 0.172, 0.162 },
			{ 0.148, 0.170, 0.161 },
			{ 0.148, 0.170, 0.162 },
			{ 0.147, 0.170, 0.162 },
			{ 0.147, 0.170, 0.162 },
			{ 0.149, 0.171, 0.162 },
			{ 0.149, 0.171, 0.162 },
			{ 0.151, 0.174, 0.167 },
			{ 0.151, 0.174, 0.166 },
			{ 0.151, 0.174, 0.167 },
			{ 0.151, 0.174, 0.166 },
			{ 0.150, 0.173, 0.165 },
			{ 0.151, 0.173, 0.166 },

			// PINK
			{ 0.194, 0.147, 0.145 },
			{ 0.193, 0.146, 0.144 },
			{ 0.193, 0.147, 0.145 },
			{ 0.193, 0.146, 0.146 },
			{ 0.194, 0.147, 0.145 },
			{ 0.184, 0.138, 0.136 },
			{ 0.194, 0.146, 0.146 },
			{ 0.194, 0.147, 0.148 },
			{ 0.194, 0.146, 0.148 },
			{ 0.194, 0.146, 0.146 },
			{ 0.194, 0.146, 0.147 },
			{ 0.195, 0.147, 0.147 },
			{ 0.193, 0.144, 0.144 },
			{ 0.193, 0.145, 0.145 },
			{ 0.192, 0.144, 0.144 },
			{ 0.192, 0.144, 0.144 },
			{ 0.194, 0.146, 0.146 },
			{ 0.193, 0.145, 0.146 },
			{ 0.193, 0.145, 0.146 },
			{ 0.189, 0.142, 0.142 },
			{ 0.189, 0.142, 0.142 },
			{ 0.189, 0.142, 0.142 },
			{ 0.192, 0.144, 0.144 },
			{ 0.192, 0.145, 0.145 },
			{ 0.193, 0.144, 0.144 },
			{ 0.193, 0.145, 0.145 },
			{ 0.192, 0.144, 0.145 },
			{ 0.193, 0.145, 0.145 },
			{ 0.192, 0.145, 0.145 },
			{ 0.193, 0.144, 0.145 },
			{ 0.192, 0.145, 0.145 },
			{ 0.192, 0.145, 0.145 },
			{ 0.193, 0.145, 0.146 },
			{ 0.193, 0.145, 0.144 },
			{ 0.188, 0.141, 0.139 },
			{ 0.189, 0.142, 0.140 },
			{ 0.188, 0.141, 0.139 },
			{ 0.189, 0.142, 0.139 },
			{ 0.189, 0.142, 0.140 },
			{ 0.189, 0.142, 0.140 },
			{ 0.189, 0.141, 0.139 },
			{ 0.188, 0.142, 0.140 },
			{ 0.188, 0.142, 0.138 },
			{ 0.189, 0.143, 0.139 },
			{ 0.188, 0.142, 0.139 },
			{ 0.188, 0.142, 0.139 },
			{ 0.189, 0.143, 0.140 },
			{ 0.189, 0.142, 0.138 },
			{ 0.188, 0.142, 0.139 },
			{ 0.188, 0.142, 0.140 },
			{ 0.189, 0.142, 0.139 },

			// YELLOW
			{ 0.201, 0.176, 0.130 }, { 0.197, 0.172, 0.126 },
			{ 0.197, 0.173, 0.126 }, { 0.197, 0.172, 0.126 },
			{ 0.198, 0.174, 0.127 },
			{ 0.196, 0.173, 0.126 },
			{ 0.196, 0.174, 0.126 },
			{ 0.196, 0.173, 0.126 },
			{ 0.196, 0.173, 0.126 },
			{ 0.196, 0.173, 0.126 },
			{ 0.197, 0.173, 0.126 },
			{ 0.197, 0.173, 0.126 },
			{ 0.196, 0.172, 0.126 },
			{ 0.196, 0.173, 0.127 },
			{ 0.196, 0.173, 0.126 },
			{ 0.196, 0.173, 0.126 },
			{ 0.196, 0.173, 0.126 },
			{ 0.196, 0.173, 0.126 },
			{ 0.196, 0.173, 0.126 },
			{ 0.199, 0.174, 0.128 },
			{ 0.201, 0.176, 0.128 },
			{ 0.200, 0.175, 0.128 },
			{ 0.200, 0.175, 0.128 },
			{ 0.200, 0.175, 0.128 },
			{ 0.200, 0.175, 0.128 },
			{ 0.200, 0.176, 0.129 },
			{ 0.191, 0.166, 0.119 },
			{ 0.191, 0.166, 0.119 },
			{ 0.190, 0.166, 0.119 },
			{ 0.190, 0.166, 0.119 },
			{ 0.190, 0.166, 0.120 },
			{ 0.192, 0.167, 0.119 },
			{ 0.191, 0.166, 0.119 },
			{ 0.192, 0.167, 0.119 },
			{ 0.190, 0.166, 0.119 },
			{ 0.192, 0.167, 0.121 },
			{ 0.192, 0.167, 0.121 },
			{ 0.197, 0.174, 0.128 },
			{ 0.200, 0.175, 0.130 },
			{ 0.200, 0.175, 0.129 },
			{ 0.200, 0.175, 0.128 },
			{ 0.200, 0.176, 0.130 },
			{ 0.199, 0.174, 0.128 },
			{ 0.199, 0.174, 0.128 },
			{ 0.199, 0.174, 0.128 },
			{ 0.199, 0.175, 0.130 },
			{ 0.201, 0.177, 0.130 },
			{ 0.200, 0.176, 0.129 },
			{ 0.200, 0.176, 0.130 },
			{ 0.201, 0.176, 0.130 },
			{ 0.200, 0.176, 0.130 },

			// GREEN
			{ 0.161, 0.181, 0.148 }, { 0.161, 0.180, 0.149 },
			{ 0.161, 0.181, 0.149 }, { 0.161, 0.180, 0.148 },
			{ 0.161, 0.181, 0.149 }, { 0.161, 0.181, 0.147 },
			{ 0.164, 0.184, 0.153 }, { 0.164, 0.184, 0.152 },
			{ 0.163, 0.182, 0.152 }, { 0.165, 0.184, 0.153 },
			{ 0.164, 0.183, 0.152 }, { 0.164, 0.184, 0.153 },
			{ 0.164, 0.183, 0.152 }, { 0.164, 0.183, 0.152 },
			{ 0.163, 0.183, 0.153 }, { 0.164, 0.184, 0.153 },
			{ 0.157, 0.176, 0.145 }, { 0.156, 0.175, 0.146 },
			{ 0.156, 0.176, 0.146 }, { 0.157, 0.176, 0.146 },
			{ 0.156, 0.175, 0.146 }, { 0.156, 0.176, 0.146 },
			{ 0.158, 0.178, 0.148 }, { 0.159, 0.178, 0.147 },
			{ 0.158, 0.177, 0.146 }, { 0.161, 0.181, 0.149 },
			{ 0.162, 0.181, 0.150 }, { 0.163, 0.182, 0.151 },
			{ 0.162, 0.182, 0.151 }, { 0.162, 0.182, 0.151 },
			{ 0.162, 0.181, 0.150 }, { 0.162, 0.182, 0.150 },
			{ 0.162, 0.181, 0.150 }, { 0.162, 0.181, 0.150 },
			{ 0.162, 0.181, 0.150 }, { 0.162, 0.181, 0.150 },
			{ 0.162, 0.181, 0.149 }, { 0.162, 0.181, 0.151 },
			{ 0.162, 0.182, 0.152 }, { 0.158, 0.178, 0.146 },
			{ 0.162, 0.182, 0.149 }, { 0.162, 0.181, 0.149 },
			{ 0.162, 0.182, 0.150 }, { 0.162, 0.181, 0.149 },
			{ 0.162, 0.182, 0.150 }, { 0.162, 0.182, 0.151 },
			{ 0.162, 0.181, 0.149 }, { 0.163, 0.182, 0.149 },
			{ 0.162, 0.182, 0.150 }, { 0.157, 0.176, 0.144 },

	};

	private static double[][] COLOR_IDEAL =

	{

			// BLACK
			{ 1.0, 1.0, 1.0 },
			{ 1.0, 1.0, 1.0 },
			{ 1.0, 1.0, 1.0 },
			{ 1.0, 1.0, 1.0 },
			{ 1.0, 1.0, 1.0 },
			{ 1.0, 1.0, 1.0 },
			{ 1.0, 1.0, 1.0 },
			{ 1.0, 1.0, 1.0 },
			{ 1.0, 1.0, 1.0 },
			{ 1.0, 1.0, 1.0 },
			{ 1.0, 1.0, 1.0 },
			{ 1.0, 1.0, 1.0 },
			{ 1.0, 1.0, 1.0 },
			{ 1.0, 1.0, 1.0 },
			{ 1.0, 1.0, 1.0 },
			{ 1.0, 1.0, 1.0 },
			{ 1.0, 1.0, 1.0 },
			{ 1.0, 1.0, 1.0 },
			{ 1.0, 1.0, 1.0 },
			{ 1.0, 1.0, 1.0 },
			{ 1.0, 1.0, 1.0 },
			{ 1.0, 1.0, 1.0 },
			{ 1.0, 1.0, 1.0 },
			{ 1.0, 1.0, 1.0 },
			{ 1.0, 1.0, 1.0 },
			{ 1.0, 1.0, 1.0 },
			{ 1.0, 1.0, 1.0 },
			{ 1.0, 1.0, 1.0 },
			{ 1.0, 1.0, 1.0 },
			{ 1.0, 1.0, 1.0 },
			{ 1.0, 1.0, 1.0 },
			{ 1.0, 1.0, 1.0 },
			{ 1.0, 1.0, 1.0 },
			{ 1.0, 1.0, 1.0 },
			{ 1.0, 1.0, 1.0 },
			{ 1.0, 1.0, 1.0 },
			{ 1.0, 1.0, 1.0 },
			{ 1.0, 1.0, 1.0 },
			{ 1.0, 1.0, 1.0 },
			{ 1.0, 1.0, 1.0 },
			{ 1.0, 1.0, 1.0 },
			{ 1.0, 1.0, 1.0 },
			{ 1.0, 1.0, 1.0 },
			{ 1.0, 1.0, 1.0 },
			{ 1.0, 1.0, 1.0 },
			{ 1.0, 1.0, 1.0 },
			{ 1.0, 1.0, 1.0 },
			{ 1.0, 1.0, 1.0 },
			{ 1.0, 1.0, 1.0 },
			{ 1.0, 1.0, 1.0 },
			{ 1.0, 1.0, 1.0 },

			// BLUE
			{ 1.0, 1.0, 0.0 },
			{ 1.0, 1.0, 0.0 },
			{ 1.0, 1.0, 0.0 },
			{ 1.0, 1.0, 0.0 },
			{ 1.0, 1.0, 0.0 },
			{ 1.0, 1.0, 0.0 },
			{ 1.0, 1.0, 0.0 },
			{ 1.0, 1.0, 0.0 },
			{ 1.0, 1.0, 0.0 },
			{ 1.0, 1.0, 0.0 },
			{ 1.0, 1.0, 0.0 },
			{ 1.0, 1.0, 0.0 },
			{ 1.0, 1.0, 0.0 },
			{ 1.0, 1.0, 0.0 },
			{ 1.0, 1.0, 0.0 },
			{ 1.0, 1.0, 0.0 },
			{ 1.0, 1.0, 0.0 },
			{ 1.0, 1.0, 0.0 },
			{ 1.0, 1.0, 0.0 },
			{ 1.0, 1.0, 0.0 },
			{ 1.0, 1.0, 0.0 },
			{ 1.0, 1.0, 0.0 },
			{ 1.0, 1.0, 0.0 },
			{ 1.0, 1.0, 0.0 },
			{ 1.0, 1.0, 0.0 },
			{ 1.0, 1.0, 0.0 },
			{ 1.0, 1.0, 0.0 },
			{ 1.0, 1.0, 0.0 },
			{ 1.0, 1.0, 0.0 },
			{ 1.0, 1.0, 0.0 },
			{ 1.0, 1.0, 0.0 },
			{ 1.0, 1.0, 0.0 },
			{ 1.0, 1.0, 0.0 },
			{ 1.0, 1.0, 0.0 },
			{ 1.0, 1.0, 0.0 },
			{ 1.0, 1.0, 0.0 },
			{ 1.0, 1.0, 0.0 },
			{ 1.0, 1.0, 0.0 },
			{ 1.0, 1.0, 0.0 },
			{ 1.0, 1.0, 0.0 },
			{ 1.0, 1.0, 0.0 },
			{ 1.0, 1.0, 0.0 },
			{ 1.0, 1.0, 0.0 },
			{ 1.0, 1.0, 0.0 },
			{ 1.0, 1.0, 0.0 },
			{ 1.0, 1.0, 0.0 },
			{ 1.0, 1.0, 0.0 },
			{ 1.0, 1.0, 0.0 },
			{ 1.0, 1.0, 0.0 },
			{ 1.0, 1.0, 0.0 },
			{ 1.0, 1.0, 0.0 },

			// PINK
			{ 1.0, 0.0, 0.0 }, { 1.0, 0.0, 0.0 }, { 1.0, 0.0, 0.0 },
			{ 1.0, 0.0, 0.0 }, { 1.0, 0.0, 0.0 },
			{ 1.0, 0.0, 0.0 },
			{ 1.0, 0.0, 0.0 },
			{ 1.0, 0.0, 0.0 },
			{ 1.0, 0.0, 0.0 },
			{ 1.0, 0.0, 0.0 },
			{ 1.0, 0.0, 0.0 },
			{ 1.0, 0.0, 0.0 },
			{ 1.0, 0.0, 0.0 },
			{ 1.0, 0.0, 0.0 },
			{ 1.0, 0.0, 0.0 },
			{ 1.0, 0.0, 0.0 },
			{ 1.0, 0.0, 0.0 },
			{ 1.0, 0.0, 0.0 },
			{ 1.0, 0.0, 0.0 },
			{ 1.0, 0.0, 0.0 },
			{ 1.0, 0.0, 0.0 },
			{ 1.0, 0.0, 0.0 },
			{ 1.0, 0.0, 0.0 },
			{ 1.0, 0.0, 0.0 },
			{ 1.0, 0.0, 0.0 },
			{ 1.0, 0.0, 0.0 },
			{ 1.0, 0.0, 0.0 },
			{ 1.0, 0.0, 0.0 },
			{ 1.0, 0.0, 0.0 },
			{ 1.0, 0.0, 0.0 },
			{ 1.0, 0.0, 0.0 },
			{ 1.0, 0.0, 0.0 },
			{ 1.0, 0.0, 0.0 },
			{ 1.0, 0.0, 0.0 },
			{ 1.0, 0.0, 0.0 },
			{ 1.0, 0.0, 0.0 },
			{ 1.0, 0.0, 0.0 },
			{ 1.0, 0.0, 0.0 },
			{ 1.0, 0.0, 0.0 },
			{ 1.0, 0.0, 0.0 },
			{ 1.0, 0.0, 0.0 },
			{ 1.0, 0.0, 0.0 },
			{ 1.0, 0.0, 0.0 },
			{ 1.0, 0.0, 0.0 },
			{ 1.0, 0.0, 0.0 },
			{ 1.0, 0.0, 0.0 },
			{ 1.0, 0.0, 0.0 },
			{ 1.0, 0.0, 0.0 },
			{ 1.0, 0.0, 0.0 },
			{ 1.0, 0.0, 0.0 },
			{ 1.0, 0.0, 0.0 },

			// YELLOW
			{ 0.0, 1.0, 0.0 }, { 0.0, 1.0, 0.0 }, { 0.0, 1.0, 0.0 },
			{ 0.0, 1.0, 0.0 }, { 0.0, 1.0, 0.0 }, { 0.0, 1.0, 0.0 },
			{ 0.0, 1.0, 0.0 }, { 0.0, 1.0, 0.0 }, { 0.0, 1.0, 0.0 },
			{ 0.0, 1.0, 0.0 }, { 0.0, 1.0, 0.0 }, { 0.0, 1.0, 0.0 },
			{ 0.0, 1.0, 0.0 }, { 0.0, 1.0, 0.0 }, { 0.0, 1.0, 0.0 },
			{ 0.0, 1.0, 0.0 }, { 0.0, 1.0, 0.0 }, { 0.0, 1.0, 0.0 },
			{ 0.0, 1.0, 0.0 }, { 0.0, 1.0, 0.0 }, { 0.0, 1.0, 0.0 },
			{ 0.0, 1.0, 0.0 }, { 0.0, 1.0, 0.0 }, { 0.0, 1.0, 0.0 },
			{ 0.0, 1.0, 0.0 }, { 0.0, 1.0, 0.0 }, { 0.0, 1.0, 0.0 },
			{ 0.0, 1.0, 0.0 }, { 0.0, 1.0, 0.0 },
			{ 0.0, 1.0, 0.0 },
			{ 0.0, 1.0, 0.0 },
			{ 0.0, 1.0, 0.0 },
			{ 0.0, 1.0, 0.0 },
			{ 0.0, 1.0, 0.0 },
			{ 0.0, 1.0, 0.0 },
			{ 0.0, 1.0, 0.0 },
			{ 0.0, 1.0, 0.0 },
			{ 0.0, 1.0, 0.0 },
			{ 0.0, 1.0, 0.0 },
			{ 0.0, 1.0, 0.0 },
			{ 0.0, 1.0, 0.0 },
			{ 0.0, 1.0, 0.0 },
			{ 0.0, 1.0, 0.0 },
			{ 0.0, 1.0, 0.0 },
			{ 0.0, 1.0, 0.0 },
			{ 0.0, 1.0, 0.0 },
			{ 0.0, 1.0, 0.0 },
			{ 0.0, 1.0, 0.0 },
			{ 0.0, 1.0, 0.0 },
			{ 0.0, 1.0, 0.0 },
			{ 0.0, 1.0, 0.0 },

			// GREEN
			{ 0.0, 0.0, 1.0 }, { 0.0, 0.0, 1.0 }, { 0.0, 0.0, 1.0 },
			{ 0.0, 0.0, 1.0 }, { 0.0, 0.0, 1.0 }, { 0.0, 0.0, 1.0 },
			{ 0.0, 0.0, 1.0 }, { 0.0, 0.0, 1.0 }, { 0.0, 0.0, 1.0 },
			{ 0.0, 0.0, 1.0 }, { 0.0, 0.0, 1.0 }, { 0.0, 0.0, 1.0 },
			{ 0.0, 0.0, 1.0 }, { 0.0, 0.0, 1.0 }, { 0.0, 0.0, 1.0 },
			{ 0.0, 0.0, 1.0 }, { 0.0, 0.0, 1.0 }, { 0.0, 0.0, 1.0 },
			{ 0.0, 0.0, 1.0 }, { 0.0, 0.0, 1.0 }, { 0.0, 0.0, 1.0 },
			{ 0.0, 0.0, 1.0 }, { 0.0, 0.0, 1.0 }, { 0.0, 0.0, 1.0 },
			{ 0.0, 0.0, 1.0 }, { 0.0, 0.0, 1.0 }, { 0.0, 0.0, 1.0 },
			{ 0.0, 0.0, 1.0 }, { 0.0, 0.0, 1.0 }, { 0.0, 0.0, 1.0 },
			{ 0.0, 0.0, 1.0 }, { 0.0, 0.0, 1.0 }, { 0.0, 0.0, 1.0 },
			{ 0.0, 0.0, 1.0 }, { 0.0, 0.0, 1.0 }, { 0.0, 0.0, 1.0 },
			{ 0.0, 0.0, 1.0 }, { 0.0, 0.0, 1.0 }, { 0.0, 0.0, 1.0 },
			{ 0.0, 0.0, 1.0 }, { 0.0, 0.0, 1.0 }, { 0.0, 0.0, 1.0 },
			{ 0.0, 0.0, 1.0 }, { 0.0, 0.0, 1.0 }, { 0.0, 0.0, 1.0 },
			{ 0.0, 0.0, 1.0 }, { 0.0, 0.0, 1.0 }, { 0.0, 0.0, 1.0 },
			{ 0.0, 0.0, 1.0 }, { 0.0, 0.0, 1.0 }

	};

	public static void main(String[] args) {
		ColorNeuralNetwork colorNN = new ColorNeuralNetwork();

		colorNN.start();

		int erros = 0, acertos = 0;

		System.out.println("Neural Network Results:");
		for (int i = 0; i < COLOR_INPUT_TEST.length; i++) {
			double[] output = new double[3];
			colorNN.compute(COLOR_INPUT_TEST[i], output);

			System.out.println();

			boolean dir0 = Math.abs(COLOR_IDEAL[i][0] - output[0]) > 0.5;
			boolean dir1 = Math.abs(COLOR_IDEAL[i][1] - output[1]) > 0.5;
			boolean dir2 = Math.abs(COLOR_IDEAL[i][2] - output[2]) > 0.3;

			if (dir0 || dir1 || dir2) {
				erros++;
				System.out.println("Erro");
			} else {
				acertos++;
				System.out.println("Acerto");
			}
			System.out.println("INPUT: " + COLOR_INPUT_TEST[i][0] + ","
					+ COLOR_INPUT_TEST[i][1] + "," + COLOR_INPUT_TEST[i][2]);
			System.out.println("OUTPUT: " + output[0] + "," + output[1] + ","
					+ output[2]);
			System.out.println("IDEAL: " + COLOR_IDEAL[i][0] + ","
					+ COLOR_IDEAL[i][1] + "," + COLOR_IDEAL[i][2]);
		}
		
		System.out.println("Total amostras " + COLOR_INPUT.length );
		System.out.println("Acertos: " + acertos);
		System.out.println("Erros: " + erros);
	}

	private static double[][] COLOR_INPUT_TEST =

	{
			// Black
			{ 0.081, 0.067, 0.078 },
			{ 0.082, 0.068, 0.078 },
			{ 0.083, 0.069, 0.078 },
			{ 0.067, 0.053, 0.062 },
			{ 0.068, 0.053, 0.064 },
			{ 0.068, 0.053, 0.063 },
			{ 0.066, 0.052, 0.060 },
			{ 0.070, 0.058, 0.060 },
			{ 0.071, 0.060, 0.065 },
			{ 0.072, 0.061, 0.065 },
			{ 0.071, 0.060, 0.065 },
			{ 0.073, 0.062, 0.068 },
			{ 0.073, 0.064, 0.069 },
			{ 0.095, 0.073, 0.091 },
			{ 0.095, 0.073, 0.090 },
			{ 0.094, 0.072, 0.090 },
			{ 0.074, 0.057, 0.071 },
			{ 0.075, 0.056, 0.070 },
			{ 0.075, 0.057, 0.071 },
			{ 0.075, 0.057, 0.071 },
			{ 0.075, 0.057, 0.071 },
			{ 0.064, 0.046, 0.056 },
			{ 0.062, 0.044, 0.056 },
			{ 0.062, 0.045, 0.056 },
			{ 0.061, 0.044, 0.055 },
			{ 0.063, 0.045, 0.056 },
			{ 0.062, 0.044, 0.056 },
			{ 0.062, 0.044, 0.056 },
			{ 0.061, 0.044, 0.056 },
			{ 0.062, 0.044, 0.056 },
			{ 0.062, 0.044, 0.055 },
			{ 0.062, 0.044, 0.056 },
			{ 0.061, 0.042, 0.055 },
			{ 0.059, 0.041, 0.053 },
			{ 0.057, 0.040, 0.053 },
			{ 0.059, 0.041, 0.053 },
			{ 0.059, 0.041, 0.048 },
			{ 0.054, 0.036, 0.046 },
			{ 0.056, 0.038, 0.047 },
			{ 0.053, 0.035, 0.046 },
			{ 0.054, 0.035, 0.046 },
			{ 0.089, 0.069, 0.086 },
			{ 0.088, 0.068, 0.085 },
			{ 0.080, 0.061, 0.076 },
			{ 0.078, 0.060, 0.076 },
			{ 0.079, 0.060, 0.075 },
			{ 0.080, 0.067, 0.075 },
			{ 0.081, 0.067, 0.078 },
			{ 0.082, 0.068, 0.078 },
			{ 0.083, 0.069, 0.078 },
			{ 0.067, 0.053, 0.062 },

			// BLUE
			{ 0.151, 0.173, 0.166 },
			{ 0.151, 0.174, 0.167 },
			{ 0.150, 0.173, 0.166 },
			{ 0.151, 0.174, 0.167 },
			{ 0.151, 0.174, 0.167 },
			{ 0.151, 0.173, 0.165 },
			{ 0.146, 0.169, 0.161 },
			{ 0.149, 0.171, 0.162 },
			{ 0.149, 0.171, 0.163 },
			{ 0.149, 0.170, 0.162 },
			{ 0.148, 0.170, 0.162 },
			{ 0.149, 0.171, 0.163 },
			{ 0.149, 0.171, 0.164 },
			{ 0.149, 0.172, 0.162 },
			{ 0.149, 0.172, 0.164 },
			{ 0.149, 0.171, 0.162 },
			{ 0.149, 0.172, 0.163 },
			{ 0.149, 0.172, 0.164 },
			{ 0.149, 0.172, 0.164 },
			{ 0.149, 0.172, 0.164 },
			{ 0.149, 0.173, 0.163 },
			{ 0.149, 0.172, 0.164 },
			{ 0.149, 0.171, 0.162 },
			{ 0.149, 0.172, 0.163 },
			{ 0.150, 0.172, 0.163 },
			{ 0.150, 0.173, 0.164 },
			{ 0.150, 0.174, 0.164 },
			{ 0.151, 0.174, 0.165 },
			{ 0.151, 0.174, 0.165 },
			{ 0.150, 0.173, 0.165 },
			{ 0.151, 0.174, 0.165 },
			{ 0.150, 0.173, 0.165 },
			{ 0.151, 0.174, 0.164 },
			{ 0.151, 0.174, 0.164 },
			{ 0.151, 0.173, 0.164 },
			{ 0.150, 0.173, 0.165 },
			{ 0.151, 0.174, 0.164 },
			{ 0.150, 0.173, 0.164 },
			{ 0.149, 0.173, 0.163 },
			{ 0.151, 0.174, 0.165 },
			{ 0.151, 0.174, 0.165 },
			{ 0.150, 0.173, 0.164 },
			{ 0.150, 0.174, 0.164 },
			{ 0.151, 0.174, 0.164 },
			{ 0.151, 0.174, 0.165 },
			{ 0.151, 0.174, 0.165 },
			{ 0.151, 0.175, 0.165 },
			{ 0.151, 0.173, 0.164 },
			{ 0.151, 0.174, 0.164 },
			{ 0.151, 0.174, 0.165 },
			{ 0.150, 0.173, 0.164 },

			// PINK
			{ 0.188, 0.142, 0.138 },
			{ 0.189, 0.143, 0.139 },
			{ 0.188, 0.142, 0.139 },
			{ 0.188, 0.142, 0.139 },
			{ 0.189, 0.143, 0.140 },
			{ 0.189, 0.142, 0.138 },
			{ 0.188, 0.142, 0.139 },
			{ 0.188, 0.142, 0.140 },
			{ 0.189, 0.142, 0.139 },
			{ 0.189, 0.143, 0.139 },
			{ 0.184, 0.138, 0.135 },
			{ 0.184, 0.138, 0.134 },
			{ 0.184, 0.137, 0.133 },
			{ 0.183, 0.139, 0.135 },
			{ 0.183, 0.138, 0.134 },
			{ 0.183, 0.138, 0.133 },
			{ 0.184, 0.139, 0.135 },
			{ 0.191, 0.144, 0.140 },
			{ 0.196, 0.147, 0.147 },
			{ 0.195, 0.146, 0.147 },
			{ 0.195, 0.146, 0.148 },
			{ 0.196, 0.147, 0.148 },
			{ 0.196, 0.148, 0.149 },
			{ 0.194, 0.145, 0.146 },
			{ 0.194, 0.145, 0.146 },
			{ 0.194, 0.145, 0.146 },
			{ 0.195, 0.146, 0.146 },
			{ 0.194, 0.145, 0.146 },
			{ 0.194, 0.146, 0.146 },
			{ 0.194, 0.145, 0.146 },
			{ 0.194, 0.145, 0.146 },
			{ 0.194, 0.146, 0.147 },
			{ 0.194, 0.146, 0.147 },
			{ 0.194, 0.145, 0.146 },
			{ 0.194, 0.145, 0.146 },
			{ 0.194, 0.146, 0.146 },
			{ 0.194, 0.145, 0.145 },
			{ 0.194, 0.145, 0.146 },
			{ 0.194, 0.146, 0.146 },
			{ 0.194, 0.145, 0.146 },
			{ 0.194, 0.146, 0.146 },
			{ 0.188, 0.142, 0.140 },
			{ 0.188, 0.142, 0.138 },
			{ 0.189, 0.143, 0.139 },
			{ 0.188, 0.142, 0.139 },
			{ 0.188, 0.142, 0.139 },
			{ 0.189, 0.143, 0.140 },
			{ 0.189, 0.142, 0.138 },
			{ 0.188, 0.142, 0.139 },
			{ 0.188, 0.142, 0.140 },
			{ 0.189, 0.142, 0.139 },

			// YELLOW
			{ 0.201, 0.176, 0.130 }, { 0.197, 0.172, 0.126 },
			{ 0.197, 0.173, 0.126 }, { 0.197, 0.172, 0.126 },
			{ 0.198, 0.174, 0.127 },
			{ 0.196, 0.173, 0.126 },
			{ 0.196, 0.174, 0.126 },
			{ 0.196, 0.173, 0.126 },
			{ 0.196, 0.173, 0.126 },
			{ 0.196, 0.173, 0.126 },
			{ 0.201, 0.176, 0.130 },
			{ 0.201, 0.176, 0.130 },
			{ 0.202, 0.177, 0.132 },
			{ 0.202, 0.177, 0.131 },
			{ 0.202, 0.177, 0.131 },
			{ 0.203, 0.178, 0.131 },
			{ 0.202, 0.177, 0.130 },
			{ 0.201, 0.176, 0.130 },
			{ 0.202, 0.177, 0.130 },
			{ 0.202, 0.177, 0.131 },
			{ 0.203, 0.177, 0.131 },
			{ 0.203, 0.177, 0.131 },
			{ 0.203, 0.178, 0.132 },
			{ 0.203, 0.177, 0.131 },
			{ 0.205, 0.178, 0.131 },
			{ 0.203, 0.177, 0.131 },
			{ 0.203, 0.177, 0.132 },
			{ 0.203, 0.177, 0.131 },
			{ 0.203, 0.177, 0.131 },
			{ 0.202, 0.177, 0.131 },
			{ 0.203, 0.177, 0.131 },
			{ 0.203, 0.177, 0.131 },
			{ 0.202, 0.177, 0.130 },
			{ 0.203, 0.178, 0.131 },
			{ 0.204, 0.178, 0.132 },
			{ 0.201, 0.175, 0.128 },
			{ 0.201, 0.176, 0.130 },
			{ 0.201, 0.176, 0.130 },
			{ 0.201, 0.177, 0.131 },
			{ 0.201, 0.177, 0.131 },
			{ 0.202, 0.177, 0.131 },
			{ 0.200, 0.175, 0.130 },
			{ 0.201, 0.176, 0.129 },
			{ 0.201, 0.176, 0.130 },
			{ 0.202, 0.176, 0.130 },
			{ 0.202, 0.178, 0.131 },
			{ 0.202, 0.176, 0.129 },
			{ 0.201, 0.176, 0.129 },
			{ 0.201, 0.175, 0.128 },
			{ 0.201, 0.176, 0.128 },
			{ 0.201, 0.175, 0.128 },

			// GREEN
			{ 0.161, 0.181, 0.148 }, { 0.161, 0.180, 0.149 },
			{ 0.161, 0.181, 0.149 }, { 0.161, 0.180, 0.148 },
			{ 0.161, 0.181, 0.149 }, { 0.161, 0.181, 0.147 },
			{ 0.164, 0.184, 0.153 }, { 0.164, 0.184, 0.152 },
			{ 0.163, 0.182, 0.152 }, { 0.165, 0.184, 0.153 },
			{ 0.159, 0.178, 0.148 }, { 0.159, 0.180, 0.149 },
			{ 0.159, 0.178, 0.149 }, { 0.159, 0.178, 0.149 },
			{ 0.159, 0.179, 0.149 }, { 0.159, 0.178, 0.149 },
			{ 0.159, 0.179, 0.149 }, { 0.161, 0.180, 0.151 },
			{ 0.159, 0.179, 0.148 }, { 0.160, 0.180, 0.149 },
			{ 0.161, 0.180, 0.149 }, { 0.161, 0.180, 0.149 },
			{ 0.161, 0.180, 0.149 }, { 0.161, 0.180, 0.149 },
			{ 0.161, 0.180, 0.149 }, { 0.161, 0.180, 0.149 },
			{ 0.161, 0.180, 0.150 }, { 0.161, 0.180, 0.149 },
			{ 0.161, 0.180, 0.149 }, { 0.160, 0.180, 0.148 },
			{ 0.161, 0.180, 0.148 }, { 0.161, 0.181, 0.149 },
			{ 0.161, 0.180, 0.148 }, { 0.161, 0.180, 0.148 },
			{ 0.161, 0.181, 0.149 }, { 0.160, 0.180, 0.149 },
			{ 0.160, 0.180, 0.148 }, { 0.160, 0.180, 0.148 },
			{ 0.161, 0.180, 0.148 }, { 0.161, 0.180, 0.148 },
			{ 0.160, 0.180, 0.147 }, { 0.161, 0.181, 0.149 },
			{ 0.164, 0.183, 0.152 }, { 0.164, 0.184, 0.152 },
			{ 0.164, 0.184, 0.152 }, { 0.159, 0.176, 0.149 },
			{ 0.161, 0.178, 0.151 }, { 0.161, 0.178, 0.151 },
			{ 0.161, 0.179, 0.152 }, { 0.161, 0.179, 0.151 }

	};

}
